package br.edu.unifei.cct720.trabalho06.model.formas;

import java.awt.Color;
import java.util.ArrayList;

import br.edu.unifei.cct720.trabalho06.model.ponto.Ponto;
import br.edu.unifei.cct720.trabalho06.model.ponto.Pontos;
import br.edu.unifei.cct720.trabalho06.model.preenchimento.BoundingBox;

/**
 * Classe responsavel por representar
 * a forma geometrica de um poligono
 * 
 * @author fknappe
 *
 */
public class Poligono implements FormaGeometrica {
	
	// Declaracao das variaveis de instancia
	private Pontos vertices;
	private Color cor;
	
	/**
	 * Construtor
	 * 
	 * @param Ponto vertice1
	 * @param Color cor
	 */
	public Poligono(Ponto vertice1, Color cor) {
		vertices = new Pontos();
		vertices.add(vertice1);
		this.cor = cor;
	}
	
	/**
	 * Construtor
	 * 
	 * @param Pontos vertices
	 * @param Color cor
	 */
	public Poligono(Pontos vertices, Color cor) {
		this.vertices = vertices;
		this.cor = cor;
	}
	
	/**
	 * Metodo responsavel por adicionar um ponto
	 * ao poligono
	 * 
	 * @param Ponto vertice
	 * 
	 * @return void
	 */
	public void adicionaVertice(Ponto vertice) {
		vertices.add(vertice);
	}

	/**
	 * Metodo responsavel por retornar
	 * o conjunto de pontos pertencentes
	 * ao poligono 
	 * 
	 * @return Pontos
	 */
	public Pontos getPontos() {
		
		// Declaracao de variaveis locais
		Pontos pontos = null;
		Ponto inicio, fim, anterior = null;
		
		pontos = new Pontos();
		
		inicio = vertices.get(0);
		fim = vertices.get(vertices.size() - 1);
		anterior = inicio;
		
		for (int i = 1; i < vertices.size(); i++) {
			pontos.addAll(new Reta(anterior, vertices.get(i), cor).getPontos());
			anterior = vertices.get(i); 
		}
		pontos.addAll(new Reta(inicio, fim, cor).getPontos());
		
		return pontos;
	}
	
	/**
	 * Metodo responsavel por retornar
	 * o conjunto de retas que formam
	 * o poligono
	 * 
	 * @return Array
	 */
	public ArrayList<Reta> getRetas() {
		
		// Declaracao de variaveis locais
		ArrayList<Reta> retas = null;
		
		retas = new ArrayList<Reta>();
		
		Ponto inicio = vertices.get(0);
		Ponto fim = vertices.get(vertices.size() - 1);
		Ponto anterior = inicio;
		for (int i = 1; i < vertices.size(); i++) {
			retas.add(new Reta(anterior, vertices.get(i), cor));
			anterior = vertices.get(i); 
		}
		retas.add(new Reta(inicio, fim, cor));
		
		return retas;
	}
	
	/**
	 * Metodo responsavel por calcular
	 * o bounding box do poligono
	 * 
	 * @return BoundingBox
	 */
	public BoundingBox getBoundingBox() {
		
		// Declaracao de variaveis locais
		Ponto inicio = null;
		int xMenor, xMaior, yMenor, yMaior = 0;
		
		inicio = vertices.get(0);
		
		xMenor = inicio.getX();
		xMaior = inicio.getX();
		yMenor = inicio.getY();
		yMaior = inicio.getY();
		
		for (int i = 1; i < vertices.size(); i++) {
			Ponto ponto = vertices.get(i);
			int x = ponto.getX();
			int y = ponto.getY();
			
			if (x < xMenor)
				xMenor = x;
			if (x > xMaior)
				xMaior = x;
			if (y < yMenor)
				yMenor = y;
			if (y > yMaior)
				yMaior = y;
		}
		
		return new BoundingBox(xMenor, yMenor, xMaior, yMaior);
	}
	
	// Metodos getters e setters
	public Pontos getVertices() {
		return vertices;
	}		
	
	public int quantidadeVertices() {
		return vertices.size();
	}

	public Color getCor() {
		return cor;
	}	
}
